﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Yahtzee.Web.Controllers
{
    public class YahtzeeController : Controller
    {
        #region Eigenschappen

        const string idx = "spel";
        private Yahtzee.Game.Spel _spel;
        private Yahtzee.Game.Spel Spel
        {
            get
            {
                if (_spel == null)
                {
                    Yahtzee.Game.Spel spel = Session[idx] as Yahtzee.Game.Spel;
                    if (spel == null)
                    {
                        spel = new Yahtzee.Game.Spel();
                        Session.Add(idx, spel);
                    }
                    _spel = spel;
                }
                return _spel;
            }
        }

        private void resetSpel()
        {
            _spel = null;
            Session[idx] = null;
        }

        #endregion

        //
        // GET: /Yahtzee/
        [HttpGet]
        public ActionResult Index()
        {
            // Force new game
            resetSpel();
            return RedirectToAction("VolgendeBeurt");
        }

        // GET: /VolgendeBeurt
        [HttpGet]
        public ActionResult VolgendeBeurt()
        {
            if (this.Spel.spelNietAfgelopen())
            {
                this.Spel.volgendeBeurt();
                return RedirectToAction("gooi");
            }
            else
            {
                return RedirectToAction("eindscore");
            }
        }

        // GET: /Gooi
        [HttpGet]
        public ActionResult Gooi()
        {
            Spel.gooiMetDobbelstenen();
            return View("spel", Spel);
        }

        [HttpPost]
        public ActionResult Gooi(FormCollection form)
        {
            bool[] zetvast = new bool[5];
            for (int i = 0; i < zetvast.Length; i++)
            {
                zetvast[i] = form["dobbelsteen" + i].ToLowerInvariant().StartsWith("true");
            }
            Spel.zetDobbelstenenVast(zetvast);
            return RedirectToAction("gooi");
        }

        public ActionResult vulCombinatieIn(string keuze)
        {
            Yahtzee.Game.Scorecombinatie combinatie =
                (from c in Spel.geefCombinaties()
                 where StringComparer.InvariantCultureIgnoreCase.Equals(keuze, c.ToString())
                 select c).Single();
            Spel.vulCombinatieIn(combinatie);
            return RedirectToAction("VolgendeBeurt");
        }

        [HttpGet]
        public ActionResult EindScore()
        {
            return View(Spel);
        }
    }
}
